library(dplyr)
library(knitr)
library(maptools)
library(TreeSegmentation)
library(ggplot2)
library(rgl)
library(clue)
library(lidR)
knit_hooks$set(webgl = hook_webgl)
opts_chunk$set(warning=F,message=F)
#set color ramp for treeID
col = pastel.colors(200)
shps<-list.files("/Users/ben/Dropbox/Weecology/ECODSEdataset/Task1/ITC/",pattern=".shp",full.names = T)
itcs<-lapply(shps,readShapePoly)
itcs[[1]]
## class : SpatialPolygonsDataFrame
## features : 9
## extent : 402390.1, 402416, 3286283, 3286317 (xmin, xmax, ymin, ymax)
## coord. ref. : NA
## variables : 3
## names : crown_id, confidence, Plot_ID
## min values : 31, High, OSBS_001
## max values : 565, High, OSBS_001
names(itcs)<-sapply(itcs,function(x){
id<-unique(x$Plot_ID)
})
print(names(itcs))
## [1] "OSBS_001" "OSBS_003" "OSBS_006" "OSBS_007" "OSBS_008" "OSBS_009"
## [7] "OSBS_010" "OSBS_011" "OSBS_014" "OSBS_015" "OSBS_016" "OSBS_017"
## [13] "OSBS_018" "OSBS_019" "OSBS_025" "OSBS_026" "OSBS_029" "OSBS_030"
## [19] "OSBS_032" "OSBS_033" "OSBS_034" "OSBS_035" "OSBS_036" "OSBS_037"
## [25] "OSBS_038" "OSBS_042" "OSBS_043" "OSBS_044" "OSBS_048" "OSBS_051"
plot(ground_truth<-itcs[[1]])
itcs[[1]]
## class : SpatialPolygonsDataFrame
## features : 9
## extent : 402390.1, 402416, 3286283, 3286317 (xmin, xmax, ymin, ymax)
## coord. ref. : NA
## variables : 3
## names : crown_id, confidence, Plot_ID
## min values : 31, High, OSBS_001
## max values : 565, High, OSBS_001
#proj_itc <-spTransform(itc, CRS("+init=epsg:32617"))
fname<-get_tile_filname(itcs[[1]])
tile<-readLAS(paste("/Users/ben/Dropbox/Weecology/NEON/cropped_",fname,sep=""))
#plot(tile)
silva<-silva2016(tile=tile,extra=T)
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.360 0.026 2.404
## [1] "Creating tree polygons"
plot(ground_truth,col='red')
plot(silva$silva_convex,add=T)
Classified lidar cloud versus predicted polygons
plot(silva$silva_tile,color="treeID",col=col,size=2)
show2d(face='z+',z=0,{
plot(silva$silva_convex,col=rgb(255, 0, 0, 30, maxColorValue=255) )
})
Classified lidar cloud versus ground_truth
plot(silva$silva_tile,color="treeID",col=col)
show2d(face='z+',z=0,{
plot(ground_truth,col=rgb(255, 0, 0, 30, maxColorValue=255) )
})
You must enable Javascript to view this page properly.
Each tree is assigned based on the maximum overlap. Pairwise membership is done using a Hungarian Algorithm. See clue::solve_LSAP.
assignment<-assign_trees(ground_truth,prediction=silva$silva_convex)
#loop through assignments and get jaccard statistic for each assignment pair
statdf<-calc_jaccard(assignment=assignment,ground_truth = ground_truth,prediction=silva$silva_convex)
qplot(statdf$IoU)
mean(statdf$IoU)
## [1] 8.476192
median(statdf$IoU)
## [1] 0.1739069
silvadf<-evaluate(ground_truth=itcs[[6]],algorithm = "silva")
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.287 0.018 2.330
## [1] "Creating tree polygons"
mean(silvadf$IoU)
## [1] 0
system.time(silvadf<-evaluate_all(itcs=itcs,algorithm = "silva"))
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.303 0.019 2.332
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.144 0.019 2.170
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.221 0.023 2.253
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.184 0.018 2.211
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.181 0.016 2.204
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.157 0.016 2.183
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.160 0.016 2.186
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.135 0.014 2.155
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.181 0.020 2.210
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.309 0.019 2.336
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.155 0.014 2.175
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.123 0.012 2.139
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.140 0.012 2.155
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.248 0.014 2.263
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.129 0.013 2.145
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.231 0.011 2.244
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.115 0.013 2.133
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.230 0.012 2.246
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.141 0.014 2.158
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.252 0.012 2.267
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.133 0.011 2.146
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.119 0.011 2.133
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.129 0.012 2.143
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.063 0.012 2.078
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.123 0.011 2.135
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.145 0.017 2.165
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.140 0.015 2.163
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.174 0.017 2.193
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.087 0.014 2.103
## [1] "Creating tree polygons"
## [1] "Computing Ground Model"
## [1] "Computing Canopy Model"
## [1] "Clustering Trees"
## user system elapsed
## 2.226 0.014 2.242
## [1] "Creating tree polygons"
## user system elapsed
## 175.138 1.538 177.149
qplot(silvadf$IoU)
mean(silvadf$IoU)
## [1] 0.1514519